package com.mindbox.mueblesalpes.negocio.promocion;

import com.mindbox.mueblesalpes.negocio.entity.Promocion2X1;
import com.mindbox.mueblesalpes.negocio.utilidades.Mensajes;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * PromocionServiceBean
 * Bean de negocion encargado de la adminsitración de las Promociones
 * @author Jaimoto
 */
@Stateless
public class PromocionServiceBean implements PromocionServiceLocal {
    @PersistenceContext
    private EntityManager em;

    @Resource(name = "jms/PromocionTopic")
    private Topic promocionTopic;
    @Resource(name = "jms/PromocionTopicFactory")
    private ConnectionFactory promocionTopicFactory;

    /**
	 * Crea una promocion
	 * @author Jaimoto
	 * @param promocion Detalle de la promoción
	 * @throws Exception
	 */
    @Override
    public void crearPromocion(Promocion2X1 promocion) throws Exception {
        Logger.getLogger(PromocionServiceBean.class.getName()).log(Level.INFO,"Creo promocion");
        // Validar datos
        if(promocion.getFechaInicio() == null ){
            throw new Exception(Mensajes.getMensaje("promocion.fechaini.null"));
        }
        if(promocion.getFechaFin() == null ){
            throw new Exception(Mensajes.getMensaje("promocion.fechafin.null"));
        }if(promocion.getMueble()  == null ){
            throw new Exception(Mensajes.getMensaje("promocion.fechafin.null"));
        }

        if(promocion.getFechaInicio().after(promocion.getFechaFin())){
            throw new Exception(Mensajes.getMensaje("promocion.fechaini.mayor"));
        }
        em.persist(promocion);
        sendJMSMessageToPromocionTopic(promocion);
    }

    /**
	 * Construye el mensaje a partir de objeto Promocion2X1
	 * @author Jaimoto
	 * @param session Sesión de mensajeria
     * @param messageData Información de la promocion 2X1 a ser enviada
     * @return Mensaje para Tópico
	 * @throws JMSException
	 */
    private Message createJMSMessageForjmsPromocionTopic(Session session, Promocion2X1 messageData) throws JMSException {
        try {
            ObjectMessage tm = session.createObjectMessage();
            tm.setObject(messageData);
            return tm;
        } catch (JMSException jMSException) {
            jMSException.printStackTrace();
            return null;
        }
    }

    /**
	 * Envía el mensaje a un tópico
	 * @author Jaimoto
     * @param messageData Información de la promocion 2X1 a ser enviada
	 * @throws JMSException
	 */
    private void sendJMSMessageToPromocionTopic(Promocion2X1 messageData) throws JMSException {
        Connection connection = null;
        Session session = null;
        try {
            connection = promocionTopicFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(promocionTopic);
            messageProducer.send(createJMSMessageForjmsPromocionTopic(session, messageData));
        } finally {
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                connection.close();
            }
        }
    }
  
}
